package com.cata.mall.portal.service.impl;

import com.cata.mall.mapper.*;
import com.cata.mall.model.*;
import com.cata.mall.portal.dao.HomeDao;
import com.cata.mall.portal.domain.FlashPromotionProduct;
import com.cata.mall.portal.domain.HomeContentResult;
import com.cata.mall.portal.domain.HomeFlashPromotion;
import com.cata.mall.portal.service.HomeService;
import com.cata.mall.portal.util.DateUtil;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.Date;
import java.util.List;

/**
 * @作者: Tao
 * @日期: 2025/10/21
 * @时间: 09:47
 * @描述: 首页内容管理Service实现类<pre>
 */
@Service
public class HomeServiceImpl implements HomeService {
    @Autowired
    private SmsHomeAdvertiseMapper advertiseMapper;
    @Autowired
    private HomeDao homeDao;
    @Autowired
    private SmsFlashPromotionMapper flashPromotionMapper;
    @Autowired
    private SmsFlashPromotionSessionMapper promotionSessionMapper;
    @Autowired
    private PmsProductMapper productMapper;
    @Autowired
    private PmsProductCategoryMapper productCategoryMapper;
    @Autowired
    private CmsSubjectMapper subjectMapper;

    /**
     * 获取首页内容
     *
     * @return 首页内容结果对象
     */
    @Override
    public HomeContentResult content() {
        HomeContentResult result = new HomeContentResult();
        //获取首页广告
        result.setAdvertiseList(getHomeAdvertiseList());
        //获取推荐品牌
        result.setBrandList(homeDao.getRecommendBrandList(0, 6));
        //获取秒杀信息
        result.setHomeFlashPromotion(getHomeFlashPromotion());
        //获取新品推荐
        result.setNewProductList(homeDao.getNewProductList(0, 4));
        //获取人气推荐
        result.setHotProductList(homeDao.getHotProductList(0, 4));
        //获取推荐专题
        result.setSubjectList(homeDao.getRecommendSubjectList(0, 4));
        return result;
    }

    /**
     * 首页商品推荐
     *
     * @param pageSize 每页显示数量
     * @param pageNum  页码
     * @return 推荐商品列表
     */
    @Override
    public List<PmsProduct> recommendProductList(Integer pageSize, Integer pageNum) {
        PageHelper.startPage(pageNum, pageSize);
        PmsProductExample example = new PmsProductExample();
        example.createCriteria()
                .andDeleteStatusEqualTo(0)
                .andPublishStatusEqualTo(1);
        return productMapper.selectByExample(example);
    }

    /**
     * 获取商品分类
     *
     * @param parentId 0:获取一级分类；其他：获取指定二级分类
     * @return 商品分类列表
     */
    @Override
    public List<PmsProductCategory> getProductCateList(Long parentId) {
        PmsProductCategoryExample example = new PmsProductCategoryExample();
        example.createCriteria()
                .andShowStatusEqualTo(1)
                .andParentIdEqualTo(parentId);
        return productCategoryMapper.selectByExample(example);
    }

    /**
     * 根据专题分类id分页获取专题
     *
     * @param cateId   专题分类id
     * @param pageSize 每页显示数量
     * @param pageNum  页码
     * @return 专题列表
     */
    @Override
    public List<CmsSubject> getSubjectList(Long cateId, Integer pageSize, Integer pageNum) {
        PageHelper.startPage(pageNum, pageSize);
        CmsSubjectExample example = new CmsSubjectExample();
        example.createCriteria()
                .andShowStatusEqualTo(1);
        if (cateId != null) {
            example.or().andCategoryIdEqualTo(cateId);
        }
        return subjectMapper.selectByExample(example);
    }

    /**
     * 分页获取人气推荐商品
     *
     * @param pageNum  页码
     * @param pageSize 每页显示数量
     * @return 人气推荐商品列表
     */
    @Override
    public List<PmsProduct> hotProductList(Integer pageNum, Integer pageSize) {
        int offset = pageSize * (pageNum - 1);
        return homeDao.getHotProductList(offset, pageSize);
    }

    /**
     * 分页获取新品推荐商品
     *
     * @param pageNum  页码
     * @param pageSize 每页显示数量
     * @return 新品推荐商品列表
     */
    @Override
    public List<PmsProduct> newProductList(Integer pageNum, Integer pageSize) {
        int offset = pageSize * (pageNum - 1);
        return homeDao.getNewProductList(offset, pageSize);
    }

    /**
     * 获取首页轮播广告
     *
     * @return 首页轮播广告列表
     */
    private List<SmsHomeAdvertise> getHomeAdvertiseList() {
        SmsHomeAdvertiseExample example = new SmsHomeAdvertiseExample();
        example.createCriteria().andTypeEqualTo(1).andStatusEqualTo(1);
        example.setOrderByClause("sort desc");
        return advertiseMapper.selectByExample(example);
    }

    /**
     * 获取首页秒杀促销信息
     *
     * @return HomeFlashPromotion 首页秒杀促销信息对象，包含当前秒杀活动的开始时间、结束时间、
     * 下一场秒杀的时间信息以及参与秒杀的商品列表
     */
    private HomeFlashPromotion getHomeFlashPromotion() {
        HomeFlashPromotion homeFlashPromotion = new HomeFlashPromotion();
        //获取当前秒杀活动
        Date now = new Date();
        SmsFlashPromotion flashPromotion = getFlashPromotion(now);
        if (flashPromotion != null) {
            //获取当前秒杀场次
            SmsFlashPromotionSession flashPromotionSession = getFlashPromotionSession(now);
            if (flashPromotionSession != null) {
                homeFlashPromotion.setStartTime(flashPromotionSession.getStartTime());
                homeFlashPromotion.setEndTime(flashPromotionSession.getEndTime());
                //获取下一个秒杀场次
                SmsFlashPromotionSession nextSession = getNextFlashPromotionSession(homeFlashPromotion.getStartTime());
                if (nextSession != null) {
                    homeFlashPromotion.setNextStartTime(nextSession.getStartTime());
                    homeFlashPromotion.setNextEndTime(nextSession.getEndTime());
                }
                //获取秒杀商品
                List<FlashPromotionProduct> promotionProductList = homeDao.getFlashProductList(flashPromotion.getId(), flashPromotionSession.getId());
                homeFlashPromotion.setProductList(promotionProductList);
            }
        }
        return homeFlashPromotion;
    }


    /**
     * 根据日期获取秒杀活动信息
     *
     * @param date 指定的日期
     * @return 符合条件的秒杀活动对象，如果不存在则返回null
     */
    private SmsFlashPromotion getFlashPromotion(Date date) {
        // 获取当前日期的开始时间
        Date currDate = DateUtil.getDate(date);
        SmsFlashPromotionExample example = new SmsFlashPromotionExample();
        // 构造查询条件：查找在指定日期范围内的秒杀活动
        example.createCriteria()
                .andStartDateLessThanOrEqualTo(currDate)
                .andEndDateGreaterThanOrEqualTo(currDate);
        List<SmsFlashPromotion> flashPromotionList = flashPromotionMapper.selectByExample(example);
        // 如果查询结果不为空，返回第一个秒杀活动对象
        if (!CollectionUtils.isEmpty(flashPromotionList)) {
            return flashPromotionList.get(0);
        }
        return null;
    }

    /**
     * 根据指定日期获取当前时间对应的闪购活动场次
     *
     * @param date 指定的日期时间
     * @return 返回在指定时间范围内匹配的第一个闪购活动场次，如果没有匹配的场次则返回null
     */
    private SmsFlashPromotionSession getFlashPromotionSession(Date date) {
        // 获取当前时间
        Date currTime = DateUtil.getTime(date);
        // 构造查询条件，查找开始时间小于等于当前时间且结束时间大于等于当前时间的场次
        SmsFlashPromotionSessionExample example = new SmsFlashPromotionSessionExample();
        example.createCriteria()
                .andStartTimeLessThanOrEqualTo(currTime)
                .andEndTimeGreaterThanOrEqualTo(currTime);
        // 执行查询并返回结果
        List<SmsFlashPromotionSession> promotionSessionList = promotionSessionMapper.selectByExample(example);
        if (!CollectionUtils.isEmpty(promotionSessionList)) {
            return promotionSessionList.get(0);
        }
        return null;
    }

    /**
     * 获取下一个闪购活动场次
     *
     * @param date 当前时间，用于筛选开始时间大于该时间的场次
     * @return 下一个闪购活动场次信息，如果不存在则返回null
     */
    private SmsFlashPromotionSession getNextFlashPromotionSession(Date date) {
        // 构造查询条件：查找开始时间大于指定时间的场次，并按开始时间升序排列
        SmsFlashPromotionSessionExample example = new SmsFlashPromotionSessionExample();
        example.createCriteria()
                .andStartTimeGreaterThan(date);
        example.setOrderByClause("start_time asc");

        // 执行查询并返回结果列表中的第一个记录（即最近的下一场次）
        List<SmsFlashPromotionSession> promotionSessionList = promotionSessionMapper.selectByExample(example);
        if (!CollectionUtils.isEmpty(promotionSessionList)) {
            return promotionSessionList.get(0);
        }
        return null;
    }


}
